package com.yang.imbatis.scan;

import com.yang.dao.UserMapper;
import com.yang.dao.UserMapper1;
import com.yang.imbatis.factory.YangFactoryBean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * @Description: 把扫描到的mapper封装为beanDefinition对象,然后为对象里面的属性赋值, 然后注册到bdmap中
 * @Author: Yang Qiang
 * @Data: 2021/10/19
 */
@Slf4j
public class YangImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
	public YangImportBeanDefinitionRegistrar() {
		log.debug("YangImportBeanDefinitionRegistrar被初始化了");
	}

	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
		// 模拟扫描出来的2个mapper, 扫描所有的接口
		List<Class> list = new ArrayList<>();
//		list.add(UserMapper.class);
//		list.add(UserMapper1.class);

		// 添加我们自己的扫描器, 进行扫描我们需要的接口
		YangClassPathBeanDefinitionScanner scanner = new YangClassPathBeanDefinitionScanner(registry, false);
		// 这里我们是写死的, 可以通过方法的AnnotationMetadata参数获取注解上面的包路径
		Set<BeanDefinitionHolder> beanDefinitionHolders = scanner.doScan("com.yang.scanBean");


		// 把扫描出来的mapper封装为BeanDefinition对象, 然后再把封装的BeanDefinition对象注册到装BeanDefinition对象的map中
		String beanClassName = "";
		for (BeanDefinitionHolder aClass : beanDefinitionHolders) {
			GenericBeanDefinition genericBeanDefinition;
			genericBeanDefinition = (GenericBeanDefinition) aClass.getBeanDefinition();
			// 得到bd的名字, 也就是我们扫描处理的接口, 必须要先获取, 才是原来接口的名字
			beanClassName = genericBeanDefinition.getBeanClassName();

			// 然后使用FactoryBean返回一个扫描出来的类的代理类
			// 也就是把扫描出来的接口改变为YangFactoryBean这个类, 这个类会返回给容器一个类
			genericBeanDefinition.setBeanClass(YangFactoryBean.class);

			// 获得genericBeanDefinition;里面的YangFactoryBean类, 然后给这个类的属性mapperInterface赋值, 也就是这里得到代理类
			genericBeanDefinition.getPropertyValues().add("mapperInterface", beanClassName);




//			// builder对应的就是, YangFactoryBean类对应的BeanDefinition对象
//			BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(YangFactoryBean.class);
//			AbstractBeanDefinition beanDefinition = builder.getBeanDefinition();
//
//			// 找到YangFactoryBean类的mapperInterface属性注入值, 值等于aClass, 也就是我们的mapper,
//			beanDefinition.getPropertyValues().add("mapperInterface", aClass);
//
//			// 然后注册到map里面去
//			registry.registerBeanDefinition(aClass.getSimpleName(), beanDefinition);
		}
	}
}
